﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;
using System.Data;

namespace AuriaCompte.Lib.Dao
{
    class DaoCompte
        : DaoBase
    {
        public DaoCompte()
            : base()
        {
            this.TableName = "comptes";
            this.ViewName = "comptes";
            this.PrimaryKeyName = "i_compte_id";
            this.ListColonne.Add("i_compte_id");
            this.ListColonne.Add("s_libelle");
            this.ListColonne.Add("s_nom_banque");
            this.ListColonne.Add("s_titulaire");
            this.ListColonne.Add("s_adresse_titulaire");
            this.ListColonne.Add("s_code_banque");
            this.ListColonne.Add("s_code_guichet");
            this.ListColonne.Add("s_code_compte");
            this.ListColonne.Add("s_cle_rib");
            this.ListColonne.Add("s_adresse_banque");
            this.ListColonne.Add("s_commentaire");
        }

        public Compte SelectById(Int32 idP)
        {
            lParam.Clear();
            Compte retour = new Compte();
            String req = this.DebutSelect
                + this.TableName
                + " WHERE " + this.PrimaryKeyName + " = @Id";

            lParam.Add(new SQLiteParameter("@Id", idP));

            SQLiteDataReader dr = this.ExecuteQueryReader(req, lParam);

            if (dr.Read())
                retour = ChargeFromReader(dr);
            dr.Close();
            return retour;
        }

        public List<Compte> SelectAll()
        {
            lParam.Clear();
            List<Compte> retour = new List<Compte>();
            String req = this.DebutSelect
                + this.TableName;

            SQLiteDataReader dr = this.ExecuteQueryReader(req);

            while (dr.Read())
                retour.Add(ChargeFromReader(dr));
            dr.Close();
            return retour;
        }

        public DataSet SelectVueSoldePrevi()
        {
            DataSet retour = new DataSet();
            String req = "SELECT s_libelle as Compte, 0 as Solde, 0 as Prévisionnel FROM comptes;";
            retour = this.ExecuteQueryDataSet(req);
            return retour;
        }

        public Compte Insert(Compte p)
        {
            lParam.Clear();

            Compte retour = new Compte();
            String req = "INSERT INTO " + TableName + "(i_compte_id, s_libelle, s_nom_banque, s_titulaire, s_adresse_titulaire, s_code_banque, s_code_guichet, s_code_compte, s_cle_rib, s_adresse_banque, s_commentaire) " +
                "VALUES(NULL, @s_libelle, @s_nom_banque, @s_titulaire, @s_adresse_titulaire, @s_code_banque, @s_code_guichet, @s_code_compte, @s_cle_rib, @s_adresse_banque, @s_commentaire)";

            lParam.Add(new SQLiteParameter("@s_libelle", p.s_libelle));
            lParam.Add(new SQLiteParameter("@s_nom_banque", p.s_nom_banque));
            lParam.Add(new SQLiteParameter("@s_titulaire", p.s_titulaire));
            lParam.Add(new SQLiteParameter("@s_adresse_titulaire", p.s_adresse_titulaire));
            lParam.Add(new SQLiteParameter("@s_code_banque", p.s_code_banque));
            lParam.Add(new SQLiteParameter("@s_code_guichet", p.s_code_guichet));
            lParam.Add(new SQLiteParameter("@s_code_compte", p.s_code_compte));
            lParam.Add(new SQLiteParameter("@s_cle_rib", p.s_cle_rib));
            lParam.Add(new SQLiteParameter("@s_adresse_banque", p.s_adresse_banque));
            lParam.Add(new SQLiteParameter("@s_commentaire", p.s_commentaire));

            
            this.ExecuteNonQuery(req, lParam);
            retour = this.SelectById(Convert.ToInt32(this.LastInsertId));

            return retour;
        }

        public Compte Update(Compte c)
        {
            lParam.Clear();

            Compte retour = new Compte();
            String req = "UPDATE " + TableName + " SET s_libelle=@s_libelle, s_nom_banque=@s_nom_banque, s_titulaire=@s_titulaire, s_adresse_titulaire=@s_adresse_titulaire, s_code_banque=@s_code_banque, s_code_guichet=@s_code_guichet, s_code_compte=@s_code_compte, s_cle_rib=@s_cle_rib, s_adresse_banque=@s_adresse_banque, s_commentaire=@s_commentaire " +
                " WHERE i_compte_id=@i_compte_id";

            lParam.Add(new SQLiteParameter("@i_compte_id", c.i_compte_id));
            lParam.Add(new SQLiteParameter("@s_libelle", c.s_libelle));
            lParam.Add(new SQLiteParameter("@s_nom_banque", c.s_nom_banque));
            lParam.Add(new SQLiteParameter("@s_titulaire", c.s_titulaire));
            lParam.Add(new SQLiteParameter("@s_adresse_titulaire", c.s_adresse_titulaire));
            lParam.Add(new SQLiteParameter("@s_code_banque", c.s_code_banque));
            lParam.Add(new SQLiteParameter("@s_code_guichet", c.s_code_guichet));
            lParam.Add(new SQLiteParameter("@s_code_compte", c.s_code_compte));
            lParam.Add(new SQLiteParameter("@s_cle_rib", c.s_cle_rib));
            lParam.Add(new SQLiteParameter("@s_adresse_banque", c.s_adresse_banque));
            lParam.Add(new SQLiteParameter("@s_commentaire", c.s_commentaire));
            
            this.ExecuteNonQuery(req, lParam);
            retour = this.SelectById(c.i_compte_id);

            return retour;
        }

        private Compte ChargeFromReader(SQLiteDataReader dr)
        {
            Compte retour = new Compte();

            retour.i_compte_id = dr.GetInt32(0);
            if (dr.IsDBNull(1))
                retour.s_libelle = String.Empty;
            else
                retour.s_libelle = dr.GetString(1);
            if (dr.IsDBNull(2))
                retour.s_nom_banque = String.Empty;
            else
                retour.s_nom_banque = dr.GetString(2);
            if (dr.IsDBNull(3))
                retour.s_titulaire = String.Empty;
            else
                retour.s_titulaire = dr.GetString(3);
            if (dr.IsDBNull(4))
                retour.s_adresse_titulaire = String.Empty;
            else
                retour.s_adresse_titulaire = dr.GetString(4);
            if (dr.IsDBNull(5))
                retour.s_code_banque = String.Empty;
            else
                retour.s_code_banque = dr.GetString(5);
            if (dr.IsDBNull(6))
                retour.s_code_guichet = String.Empty;
            else
                retour.s_code_guichet = dr.GetString(6);
            if (dr.IsDBNull(7))
                retour.s_code_compte = String.Empty;
            else
                retour.s_code_compte = dr.GetString(7);
            if (dr.IsDBNull(8))
                retour.s_cle_rib = String.Empty;
            else
                retour.s_cle_rib = dr.GetString(8);
            if (dr.IsDBNull(9))
                retour.s_adresse_banque = String.Empty;
            else
                retour.s_adresse_banque = dr.GetString(9);
            if (dr.IsDBNull(10))
                retour.s_commentaire = String.Empty;
            else
                retour.s_commentaire = dr.GetString(10);

            return retour;
        }
    }
}
